/**
 * 20220302:更改three引入方式
 */

import {MathUtils} from 'three';
import Props from "./props";

/**
 * 工作空间
 */
export default class WorkSpace{
    constructor(...params){
        this.params=params;
        this.init();
    }

    //---------------------------------对外属性及方法----------------------------------
    /**
     * 空间名称
     */
    get spaceName(){
        return 'defaultSpace';
    }

    /**
     * 空间ID
     */
    get uuid(){
        return this._uuid;
    }

    /**
     * 启用/禁用
     */
    get active(){
        return this._props.active.value;
    }
    set active(bol){
        this._props.active.value=bol;
    }

    /**
     * 重置
     */
    set reset(bol){
        this._props.reset.value=bol;
    }

    /**
     * 属性对象
     */
    get props(){
        return this._props;
    }

    /**
     * 进入/退出空间时的操作
     */
    onActive(bol){}

    /**
     * 重置时的操作
     */
    onReset(){}

    /**
     * 渲染函数
     */
    render(renderer){
        if(this._firstRender){
            this.onFirstRender(renderer);
            this._firstRender=null;
        }
    }

    /**
     * 窗体更改时的操作
     */
    resize(size){
    }

    /**
     * 首次渲染时的操作
     */
    onFirstRender(renderer){}

    /**
     * 销毁空间
     */
    dispose(renderer=null){
        if(renderer)renderer.removeFromQueue(this);
        this._props.dispose();
        this._props=null;
        this._uuid=null;
        this._firstRender=null;
    }

    //--------------------------------------------内部方法------------------------------------

    init(){
        this.initProps();
        this.initVariable();
        this.initComponents();
        this.initPropCallback();
        this.initialize();
    }

    /**
     * 初始化属性
     */
    initProps(){
        this._props=new Props({
            active:false,
            reset:false,
        });
    }

    /**
     * 初始化变量
     */
    initVariable(){
        this._uuid=MathUtils.generateUUID();
        this._firstRender=true;
    }

    /**
     * 初始化组件
     */
    initComponents(){}

    /**
     * 初始化状态
     */
    initialize(){}

    /**
     * 初始化属性函数
     */
    initPropCallback(){
        this._props.onKeyChange('active',(_new,_old)=>{
            this.onActive(_new);
        });
        this._props.onKeyChange('reset',(_new,_old)=>{
            if(this._props.reset.value){
                this.onReset();
                this._props.reset.value=false;
            }
        });
    }
}